package Class对象功能的演示;

import 反射中Class对象的创建.Person;

import java.lang.reflect.Field;

/**
 * @Auther:云尚学Java
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws Exception {
        //2. 类名.class;通过类名的属性class获取
        Class personClass= Person.class;
        System.out.println("2:"+personClass);
        /**
         * * Field[] getFields() ：获取所有public修饰的成员变量
         * * Field getField(String name)   获取指定名称的 public修饰的成员变量
         *
         * * Field[] getDeclaredFields()  获取所有的成员变量，不考虑修饰符
         * * Field getDeclaredField(String name)
         */
        Field[] fields=personClass.getFields();//存储的就是Person类下所有public修饰的成员变量
        for(Field field:fields){
            System.out.println(field);
        }
        System.out.println("-------------");
        Field b=personClass.getField("b");
        System.out.println(b);
        System.out.println("-------------");
        /**
         * 对于获取的b变量有什么作用呢？
         *
         * 变量本身的作用：
         *         赋值
         *         取值
         */
        Person p=new Person();
        //Object value=b.get(p);
        //System.out.println("value:"+value);//null

        b.set(p,"张三");
        Object value=b.get(p);
        System.out.println("value:"+value);//张三
        /**
         * 1. 获取成员变量们

         * Field[] getDeclaredFields()  获取所有的成员变量，不考虑
         * Field getDeclaredField(String name)
         */
        System.out.println("-----------");
        Field[] declaredField=personClass.getDeclaredFields();
        for(Field df:declaredField){
            System.out.println(df);
        }
        System.out.println("----------");
        Field age=personClass.getDeclaredField("age");
        System.out.println(age);
        System.out.println("----------");
        //暴力反射
        age.setAccessible(true);
        Object value1=age.get(p);
        System.out.println("age:"+value1);//0
        age.set(p,80);
        Object value2=age.get(p);
        System.out.println("age:"+value2);//80
    }
}
